package com.lej.core.base

import android.app.Activity
import androidx.fragment.app.Fragment
import com.lej.core.utils.ScreenUtil
import java.util.*

/**
 * activity堆栈式管理
 */
object AppManager {
    private val activityStack = Stack<Activity>()
    private val fragmentStack = Stack<Fragment>()
    internal var homeAct: Class<out Activity>? = null

    /**
     * 添加Activity到堆栈
     */
    fun addActivity(activity: Activity?) {
        activity?.let { activityStack.add(it) }
    }

    fun setHomeActivity(activity: Class<out Activity>) {
        homeAct = activity
    }

    /**
     * 移除指定的Activity
     */
    fun removeActivity(activity: Activity?) {
        activity?.let { activityStack.remove(it) }
    }

    /**
     * 是否有activity
     */
    fun hasActivity() = activityStack.isNotEmpty()

    /**
     * 获取当前Activity（堆栈中最后一个压入的）
     */
    fun currentActivity(): Activity? = activityStack.lastOrNull()

    /**
     * 结束当前Activity（堆栈中最后一个压入的）
     */
    fun finishActivity() {
        finishActivity(currentActivity())
    }

    /**
     * 结束指定的Activity
     */
    fun finishActivity(activity: Activity?) {
        activity?.takeUnless { activity.isFinishing }?.finish()
    }

    /**
     * 结束指定类名的Activity
     */
    fun finishActivity(cls: Class<out Activity?>) {
        activityStack.asSequence().filter { it.javaClass == cls }.forEach(::finishActivity)
    }

    /**
     * 结束所有Activity
     */
    fun finishAllActivity() {
        activityStack.forEach(::finishActivity)
        activityStack.clear()
    }

    /**
     * 获取指定的Activity
     *
     * @author kymjs
     */
    fun getActivity(cls: Class<out Activity?>?): Activity? {
        if (cls == null) return null
        return activityStack.firstOrNull { it.javaClass == cls }
    }

    fun hasTagActivity(actName: String?): Boolean {
        if (actName == null) return false
        return activityStack.any { it.javaClass.simpleName == actName }
    }

    /**
     * 添加Fragment到堆栈
     */
    fun addFragment(fragment: Fragment) {
        fragmentStack.add(fragment)
    }

    /**
     * 移除指定的Fragment
     */
    fun removeFragment(fragment: Fragment?) {
        fragmentStack.remove(fragment)
    }

    /**
     * 是否有Fragment
     */
    val isFragment: Boolean
        get() = !fragmentStack.isEmpty()

    /**
     * 获取当前Activity（堆栈中最后一个压入的）
     */
    fun currentFragment(): Fragment? = fragmentStack.lastOrNull()

    /**
     * 退出应用程序
     */
    fun exitApp() {
        try {
            finishAllActivity()
            // 杀死该应用进程
//          android.os.Process.killProcess(android.os.Process.myPid());
//            调用 System.exit(n) 实际上等效于调用：
//            Runtime.getRuntime().exit(n)
//            finish()是Activity的类方法，仅仅针对Activity，当调用finish()时，只是将活动推向后台，并没有立即释放内存，活动的资源并没有被清理；当调用System.exit(0)时，退出当前Activity并释放资源（内存），但是该方法不可以结束整个App如有多个Activty或者有其他组件service等不会结束。
//            其实android的机制决定了用户无法完全退出应用，当你的application最长时间没有被用过的时候，android自身会决定将application关闭了。
//System.exit(0);
        } catch (e: Exception) {
            activityStack.clear()
            e.printStackTrace()
        }
    }
}

val currentActivity: Activity? get() = AppManager.currentActivity()
val app: BaseApplication get() = BaseApplication.instance
val statusHeight: Int get() = ScreenUtil.getStatusBarHeight(BaseApplication.instance)

/**获取首页,需要在业务层定义*/
val homeActivity: Class<out Activity>? get() = AppManager.homeAct